[AWS Technical Support Note] วิธีตั้งค่าการเข้าถึงบริการของ AWS ด้วยการจำกัดการเข้าถึงด้วยเงื่อนไขที่กำหนดโดยใช้ IAM policy
ปัญหาที่เกิดขึ้น
ระบุ "aws:SourceIp"
ใน IAM policy เพื่อจำกัด IP หลังจากนั้นก็เกิดข้อผิดพลาดจากการจำกัด IP ในบริการของ AWS อย่างเช่น CloudFormation ซึ่งเป็นบริการที่ควบคุมสภาพแวดล้อม AWS แทนผู้ใช้งาน
ต้องทำยังไงถึงจะทำให้บริการของ AWS เข้าถึงทรัพยากรของ AWS ได้โดยยังคงจำกัด IP ในการเข้าถึงได้
วิธีแก้ปัญหา
ด้วยการเพิ่ม policy ต่อไปนี้ภายในบล็อก "Condition"
ที่จะระบุ "aws:SrouceIp"
ใน IAM Policy จะทำให้สามารถจำกัดการเข้าถึงของผู้ใช้บริการด้วย IP address ที่ระบุได้ และยังคงอนุญาตการเข้าถึงบริการของ AWS ได้อีกด้วย
{
"Bool": {"aws:ViaAWSService": "false"}
}
"aws:ViaAWSService"
คือ condition keys ที่กำหนดว่าบริการ AWS ดำเนินการตามคำขอแทนผู้ใช้งานหรือไม่ โดยค่าจะเป็น "true"
เมื่อเข้าถึงโดยบริการ AWS อย่างเช่น CloudFormation เป็นต้น
โดยจะใช้ condition keys ตามรายละเอียดทางด้านล่าง
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"192.0.2.0/24",
"203.0.113.0/24"
]
},
"Bool": {"aws:ViaAWSService": "false"}
}
}
}
AWS: Denies access to AWS based on the source IP - AWS Identity and Access Management (English)
วิธีอ่าน policy
คิดว่ามีคงมีหลายท่านที่เห็น policy ข้างต้นแล้วอาจจะยังไม่เข้าใจ(ซึ่งเป็นเรื่องปกติ) เลยจะอธิบายวิธีอ่านบล็อก Condition
แบบง่ายๆให้ดูกันครับ
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"192.0.2.0/24",
"203.0.113.0/24"
]
},
"Bool": {"aws:ViaAWSService": "false"}
}
ในบล็อก "Condition"
ด้านบนจะเป็น AND และบล็อก "aws:SourceIp"
จะเป็น OR
เมื่อบริการของ AWS เช่น CloudFormation ดำเนินการร้องขอแทนผู้ใช้งาน "Bool": {"aws:ViaAWSService": "false"}
(ไม่ใช่การเข้าถึงบริการของ AWS) จะถูกพิจารณาว่าเป็นเท็จเสมอ และ policy ข้างต้น (จำกัด IP Address ที่มีการเข้าถึง) จะถูกปิดการใช้งาน
เมื่อผู้ใช้บริการ (ผู้ใช้งาน) ทำการร้องขอ "Bool": {"aws:ViaAWSService": "false"}
จะถูกพิจารณาว่าเป็นจริงเสมอ
แสดงให้เห็นว่าผลลัพธ์จะถูกกำหนดโดย IP Address ต้นทางที่เข้าถึงในเงื่อนไขของ AND
หรือหากลองนึกภาพเงื่อนไข อย่างเช่น if True && <มี IP address ที่เข้าถึงอยู่ในรายการหรือไม่>
ก็จะช่วยให้เข้าใจได้ง่ายขึ้น
บทความอ้างอิง
- AWS: Denies access to AWS based on the source IP - AWS Identity and Access Management (English)
- Conditions with multiple context keys or values - AWS Identity and Access Management (English)
- aws:ViaAWSService (English)
Use this key to check whether an AWS service makes a request to another service on your behalf.
The request context key returns true when a service uses the credentials of an IAM principal to make a request on behalf of the principal. The context key returns false if the service uses a service role or service-linked role to make a call on the principal's behalf. The request context key also returns false when the principal makes the call directly.
ใช้ key นี้เพื่อตรวจสอบว่าบริการของ AWS มีการส่งคำขอไปยังบริการอื่นแทนคุณหรือไม่
คำขอจะตอบกลับเป็นจริงเมื่อบริการใช้ข้อมูลประจำตัวของ IAM principal ในการร้องขอในนามของ principal และคำขอจะตอบกลับเป็นเท็จหากบริการใช้ role ของบริการ หรือ role ที่เชื่อมโยงกับบริการเพื่อทำการร้องขอในนามของ principal โดยคำขอจะยังตอบกลับเป็นเท็จเมื่อ principal ทำการร้องขอโดยตรง